home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / Libraries / PlayerPRO 4.4.1 / MADF Library 3.0 / Game.c < prev    next >
C/C++ Source or Header  |  1995-04-10  |  7KB  |  325 lines

  1. //
  2. //        Exemple d'utilisation des routines contenues
  3. //        dans la ROSSETMOD.lib et la ROSSETGraph.lib
  4. //
  5. //        Copyright 1992 Antoine ROSSET
  6. //
  7. //
  8.  
  9. #include "Retrace.h"
  10. #include "MAD.h"
  11. #include "RDriver.h"
  12. #include "Sound.h"
  13. #include "AIFF.h"
  14. #include "SoundInput.h"
  15.  
  16. extern    Boolean    Reading;
  17. extern    short        PL;
  18. extern    long    alphaTest = 0;
  19.  
  20. short        SIter = 370;
  21. Point    PP ={ 200, 470}, De = { 200, 100};
  22. Boolean    ActualSize = false;
  23. Ptr        tempPtr;
  24. Ptr        Val;
  25. void DoConversionS3M( Str255 fName, short vRef);
  26.  
  27. void MyDebugStr( Str255 aStr)
  28. {
  29.     DebugStr( aStr);
  30. }
  31.  
  32. unsigned char *pStrcat(unsigned char *s, unsigned char *t)
  33. {
  34.     unsigned char *s2;
  35.     short tLen;
  36.  
  37.     s2 = s + *s;
  38.     *s += (tLen = *t);
  39.     for (++tLen; --tLen; s2[tLen] = t[tLen]);
  40.     return (s);
  41. }
  42.  
  43. Handle DoExp1to3( Handle sound, unsigned long numSampleFrames)
  44. {
  45. long    i;
  46. Ptr        inState, outState;
  47. Handle    outBuffer;
  48.  
  49.     outState = NewPtrClear( 128);
  50.     inState = NewPtrClear( 128);
  51.     if( inState == nil)
  52.     {
  53.         /* Error */
  54.     }
  55.     
  56.     outBuffer = NewHandle( numSampleFrames*6);
  57.     if( outBuffer == nil)
  58.     {
  59.         /* Error */
  60.     }
  61.     
  62.     HLock( sound);
  63.     HLock( outBuffer);
  64.     
  65.     Exp1to3( *sound, *outBuffer, numSampleFrames, inState, outState, 1, 1);
  66.     
  67.     HUnlock( sound);
  68.     HUnlock( outBuffer);
  69.         
  70.     DisposHandle( sound);
  71.     sound = outBuffer;
  72.     
  73.     DisposPtr( inState);
  74.     DisposPtr( outState);
  75.  
  76.     return sound;
  77. }
  78.  
  79. Handle DoExp1to6( Handle sound, unsigned long numSampleFrames)
  80. {
  81. long    i;
  82. Ptr        inState, outState;
  83. Handle    outBuffer;
  84.  
  85.     outState = NewPtrClear( 128);
  86.     inState = NewPtrClear( 128);
  87.     if( inState == nil)
  88.     {
  89.         /* Error */
  90.     }
  91.     
  92.     outBuffer = NewHandle( numSampleFrames * 6);
  93.     if( outBuffer == nil)
  94.     {
  95.         /* Error */
  96.     }
  97.     
  98.     HLock( sound);
  99.     HLock( outBuffer);
  100.     
  101.     Exp1to6( *sound, *outBuffer, numSampleFrames, inState, outState, 1, 1);
  102.     
  103.     HUnlock( sound);
  104.     HUnlock( outBuffer);
  105.         
  106.     DisposHandle( sound);
  107.     sound = outBuffer;
  108.     
  109.     DisposPtr( inState);
  110.     DisposPtr( outState);
  111.  
  112.     return sound;
  113. }
  114.  
  115. void ConvertInstrument( register    Byte    *tempPtr,    register long sSize)
  116. {
  117.     register    Byte            val = 0x80;
  118.  
  119.     while( sSize > 0)
  120.     {
  121.         sSize--;
  122.         *(tempPtr + sSize) += val;
  123.     }
  124. }
  125.  
  126. /*************************************************************/
  127. /*                       SndToHandle                         */
  128. /* This function is only useful if you use OSErr PlaySound() */
  129. /*************************************************************/
  130. /* This function extract a raw handle from a 'snd ' handle   */
  131. /*************************************************************/
  132. Handle SndToHandle( Handle sound, short    *sampleSize)
  133. {
  134.     Ptr             soundPtr;
  135.     short             soundFormat;
  136.     short             numSynths, numCmds, CompressID;
  137.     long             offset, MusSize;
  138.     SoundHeaderPtr     header;
  139.     CmpSoundHeader    *CmpHeader;
  140.     ExtSoundHeader    *ExtHeader;
  141.     SndCommand         cmd;
  142.     OSErr             result;
  143.     long            i,x, numFrames;
  144.     Boolean            change = false;
  145.     
  146.     *sampleSize = 8;
  147.     
  148.     HLock( sound);
  149.     soundPtr = *sound;
  150.     
  151.     soundFormat = *(short*)soundPtr;
  152.     
  153.     switch(soundFormat)
  154.     {
  155.         case 1:
  156.             numSynths = ((short*)soundPtr)[1];
  157.             numCmds = *(short*)(soundPtr+4+numSynths*6);
  158.         break;
  159.         
  160.         case 2:
  161.             numSynths = 0;
  162.             numCmds = ((short*)soundPtr)[2];
  163.         break;
  164.         
  165.         default:
  166.             MyDebugStr("\p SndToHandle");
  167.         break;
  168.     } 
  169.  
  170.     offset = 6 + 6*numSynths + 8*numCmds;
  171.     header = (SoundHeaderPtr) (StripAddress(*sound) + offset);
  172.     
  173.     switch( header->encode)
  174.     {
  175.         case cmpSH:
  176.             CmpHeader = (CmpSoundHeader*) header;
  177.             CompressID = CmpHeader->compressionID;
  178.             
  179.             *sampleSize = CmpHeader->sampleSize;
  180.             
  181.             MusSize = (*CmpHeader).numFrames;
  182.             
  183.             HLock( sound);
  184.             BlockMove( (*CmpHeader).sampleArea, *sound, MusSize);
  185.             HUnlock( sound);
  186.             
  187.             switch( CompressID )
  188.             {
  189.                 case threeToOne:
  190.                     MusSize *= 2;
  191.                     sound = DoExp1to3( sound, MusSize);
  192.                     MusSize *= 3;
  193.                 break;
  194.                 
  195.                 case sixToOne:
  196.                     sound = DoExp1to6( sound, MusSize);
  197.                     MusSize *= 6;
  198.                 break;
  199.                 
  200.                 default:
  201.                 break;
  202.             }
  203.         break;
  204.  
  205.         case extSH:
  206.             ExtHeader = (ExtSoundHeader*) header;
  207.             
  208.             MusSize = ExtHeader->numFrames;
  209.             *sampleSize = ExtHeader->sampleSize;
  210.             
  211.             if( *sampleSize == 16) MusSize *= 2;
  212.             
  213.             HLock( sound);
  214.             BlockMove( ExtHeader->sampleArea, *sound, MusSize);
  215.             HUnlock( sound);
  216.         break;
  217.         
  218.         case stdSH:
  219.             MusSize = header->length;
  220.             BlockMove( (*header).sampleArea, *sound, MusSize);
  221.             HUnlock( sound);
  222.         break;
  223.     }
  224.  
  225.     ConvertInstrument( (Byte*) *sound,    MusSize);
  226.  
  227.     HUnlock( sound);
  228.     SetHandleSize( sound, MusSize);
  229.     
  230.     if( MemError()) DebugStr( "\p MemError in SetHandleSize");
  231.  
  232.     return( sound);
  233. }
  234.  
  235. main()
  236. {
  237. EventRecord        theEvent;
  238. Point            where = { 50,50};
  239. SFReply            reply;
  240. short            srcFile, sampleSize;
  241. OSErr            iErr;
  242. long            musicSize;
  243. DialogPtr        TheDia;
  244. Handle            itemHandle;
  245. Rect            itemRect;
  246. short            itemType, i, itemHit;
  247. Handle            mySound[ 4];            // my 4 sound resource
  248.  
  249. /* Initialisation de la toolbox */
  250.  
  251. InitGraf( &qd.thePort);
  252. InitFonts();
  253. InitWindows();
  254. TEInit();
  255. InitMenus();
  256. InitCursor();
  257. MaxApplZone();
  258.  
  259. /******************************************/
  260. /*** Load and prepare my sound resource ***/
  261. /******************************************/
  262.  
  263. for( i = 0 ; i < 4; i++)
  264. {
  265.     mySound[ i] = GetResource( 'snd ', 128 + i);
  266.     if( mySound[ i] != 0L) mySound[ 0] = SndToHandle( mySound[ i], &sampleSize);        /* Convert the Snd Handle to raw handle */
  267.     HLock( mySound[ i]);
  268. }
  269.  
  270. /******************************************/
  271. /***        Initialize driver           ***/
  272. /******************************************/
  273. PtrSystem = false;
  274. if( RInitMusic( SMStereo, 4, false) != noErr)    DebugStr("\pNeed more memory");
  275. RLoadMusicRsrc( 'MADF', 3214);
  276. RPlayMusic();                        // Run the driver
  277.  
  278. /******************************************/
  279. /***        Open my dialog              ***/
  280. /******************************************/
  281.  
  282.  
  283. TheDia = GetNewDialog( 128,0L, (WindowPtr) -1L);
  284. SetPort( TheDia);        
  285.  
  286. do
  287. {
  288.     ModalDialog( 0L, &itemHit);
  289.         
  290.     switch( itemHit)
  291.     {
  292.         case 2:
  293.             Reading = !Reading;
  294.             CleanDriver();
  295.         break;
  296.     
  297.         case 3:
  298.             RPlaySound( *mySound[ 0], GetHandleSize( mySound[ 0]), 0, 30, sampleSize, 0, 0);        // On track ID 0, 30 = normal period
  299.         break;
  300.         
  301.         case 4:
  302.             RPlaySound( *mySound[ 1], GetHandleSize( mySound[ 1]), 1, 30, sampleSize, 0, 0);        // On track ID 1, 30 = normal period
  303.         break;
  304.         
  305.         case 5:
  306.             RPlaySound( *mySound[ 2], GetHandleSize( mySound[ 2]), 2, 30, sampleSize, 0, 0);        // On track ID 2, 30 = normal period
  307.         break;
  308.         
  309.         case 6:
  310.             RPlaySound( *mySound[ 3], GetHandleSize( mySound[ 3]), 3, 30, sampleSize, 0, 0);        // On track ID 3, 30 = normal period
  311.         break;
  312.     }
  313.     
  314. }while( itemHit != 1);
  315.  
  316. DisposDialog( TheDia);
  317.  
  318. RStopMusic();                    // Stop the driver
  319. RClearMusic();                    // Clear music
  320. RQuitMusic();                    // Dispose driver
  321.  
  322. ExitToShell();
  323. }
  324.  
  325.